package com.bailian.system.service;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import com.bailian.system.domain.BlPark;
import com.bailian.system.domain.vo.BlParkVo;

/**
 * 园区信息Service接口
 * 
 * @author bailian
 * @date 2025-08-04
 */
public interface IBlParkService 
{
    /**
     * 根据ID查询园区信息
     * 
     * @param parkId 园区ID
     * @return 园区信息
     */
    BlParkVo selectById(Long parkId);

    /**
     * 查询园区列表
     * 
     * @param park 查询条件
     * @return 园区列表
     */
    List<BlParkVo> selectList(BlPark park);

    /**
     * 分页查询园区列表
     * 
     * @param park 查询条件
     * @return 园区列表
     */
    List<BlParkVo> selectPage(BlPark park);
    /**
     * 轻量级查询园区列表（不包含关联查询）
     * 专用于分页查询，避免额外的数据库查询干扰分页信息
     * 
     * @param park 查询条件
     * @return 园区列表
     */
    List<BlParkVo> selectListLightweight(BlPark park);

    /**
     * 原始分页查询园区列表（手动分页）
     * 
     * @param park 查询条件
     * @param pageNum 页码
     * @param pageSize 每页条数
     * @return 分页结果，包含数据和总数
     */
    Map<String, Object> selectPageWithLimit(BlPark park, int pageNum, int pageSize);
    /**
     * 根据条件查询园区列表
     * 
     * @param conditions 查询条件
     * @return 园区列表
     */
    List<BlParkVo> selectByConditions(Map<String, Object> conditions);

    /**
     * 根据标签查询园区列表
     * 
     * @param tagName 标签名称
     * @return 园区列表
     */
    List<BlParkVo> selectByTag(String tagName);

    /**
     * 根据仓库类型查询园区列表
     * 
     * @param warehouseType 仓库类型
     * @return 园区列表
     */
    List<BlParkVo> selectByWarehouseType(String warehouseType);

    /**
     * 根据硬件配置查询园区列表
     * 
     * @param hardwareConfig 硬件配置
     * @return 园区列表
     */
    List<BlParkVo> selectByHardwareConfig(String hardwareConfig);

    /**
     * 根据服务类型查询园区列表
     * 
     * @param serviceType 服务类型
     * @return 园区列表
     */
    List<BlParkVo> selectByServiceType(String serviceType);

    /**
     * 根据推荐状态查询园区列表
     * 
     * @param isRecommend 推荐状态 (0-否, 1-是)
     * @return 园区列表
     */
    List<BlParkVo> selectByRecommend(String isRecommend);

    /**
     * 根据价格范围查询园区列表
     * 
     * @param minPrice 最低价格
     * @param maxPrice 最高价格
     * @return 园区列表
     */
    List<BlParkVo> selectByPriceRange(BigDecimal minPrice, BigDecimal maxPrice);

    /**
     * 根据面积范围查询园区列表
     * 
     * @param minArea 最小面积
     * @param maxArea 最大面积
     * @return 园区列表
     */
    List<BlParkVo> selectByAreaRange(BigDecimal minArea, BigDecimal maxArea);

    /**
     * 根据地理位置查询园区列表
     * 
     * @param location 地理位置关键词
     * @return 园区列表
     */
    List<BlParkVo> selectByLocation(String location);

    /**
     * 查询推荐园区列表
     * 
     * @param limit 限制数量
     * @return 推荐园区列表
     */
    List<BlParkVo> selectRecommendList(int limit);

    /**
     * 查询热门园区列表
     * 
     * @param limit 限制数量
     * @return 热门园区列表
     */
    List<BlParkVo> selectHotList(int limit);

    /**
     * 新增园区信息
     * 
     * @param park 园区信息
     * @return 影响行数
     */
    int insert(BlPark park);

    /**
     * 批量新增园区信息
     * 
     * @param parkList 园区信息列表
     * @return 影响行数
     */
    int insertBatch(List<BlPark> parkList);

    /**
     * 更新园区信息
     * 
     * @param park 园区信息
     * @return 影响行数
     */
    int update(BlPark park);

    /**
     * 根据ID删除园区信息
     * 
     * @param parkId 园区ID
     * @return 影响行数
     */
    int deleteById(Long parkId);

    /**
     * 批量删除园区信息
     * 
     * @param parkIds 园区ID数组
     * @return 影响行数
     */
    int deleteByIds(Long[] parkIds);

    /**
     * 统计园区总数
     * 
     * @param park 查询条件
     * @return 园区总数
     */
    int count(BlPark park);

    /**
     * 统计推荐园区数量
     * 
     * @return 推荐园区数量
     */
    int countRecommend();

    /**
     * 统计各类型园区数量
     * 
     * @return 各类型园区数量统计
     */
    List<Map<String, Object>> countByType();

    /**
     * 统计各区域园区数量
     * 
     * @return 各区域园区数量统计
     */
    List<Map<String, Object>> countByLocation();

    /**
     * 获取园区价格统计信息
     * 
     * @return 价格统计信息
     */
    Map<String, Object> getPriceStatistics();

    /**
     * 获取园区面积统计信息
     * 
     * @return 面积统计信息
     */
    Map<String, Object> getAreaStatistics();

    /**
     * 检查园区名称是否存在
     * 
     * @param parkName 园区名称
     * @param excludeId 排除的园区ID
     * @return 存在数量
     */
    int checkNameExists(String parkName, Long excludeId);

    /**
     * 更新园区推荐状态
     * 
     * @param parkId 园区ID
     * @param isRecommend 推荐状态
     * @return 影响行数
     */
    int updateRecommendStatus(Long parkId, String isRecommend);

    /**
     * 更新园区出租面积
     * 
     * @param parkId 园区ID
     * @param rentedArea 已出租面积
     * @return 影响行数
     */
    int updateRentedArea(Long parkId, BigDecimal rentedArea);

    /**
     * 批量根据ID查询园区信息
     * 
     * @param parkIds 园区ID数组
     * @return 园区列表
     */
    List<BlParkVo> selectByIds(Long[] parkIds);

    /**
     * 根据多个标签查询园区列表
     * 
     * @param tags 标签数组
     * @return 园区列表
     */
    List<BlParkVo> selectByTags(String[] tags);

    /**
     * 根据多个仓库类型查询园区列表
     * 
     * @param warehouseTypes 仓库类型数组
     * @return 园区列表
     */
    List<BlParkVo> selectByWarehouseTypes(String[] warehouseTypes);

    /**
     * 根据多个硬件配置查询园区列表
     * 
     * @param hardwareConfigs 硬件配置数组
     * @return 园区列表
     */
    List<BlParkVo> selectByHardwareConfigs(String[] hardwareConfigs);

    /**
     * 根据多个服务类型查询园区列表
     * 
     * @param serviceTypes 服务类型数组
     * @return 园区列表
     */
    List<BlParkVo> selectByServiceTypes(String[] serviceTypes);

    /**
     * 查询可用面积大于指定值的园区
     * 
     * @param availableArea 可用面积
     * @return 园区列表
     */
    List<BlParkVo> selectByAvailableArea(BigDecimal availableArea);

    /**
     * 查询出租率低于指定值的园区
     * 
     * @param rentalRate 出租率
     * @return 园区列表
     */
    List<BlParkVo> selectByRentalRate(BigDecimal rentalRate);

    /**
     * 统计各价格区间的园区数量
     * 
     * @return 价格区间统计
     */
    List<Map<String, Object>> countByPriceRange();

    /**
     * 统计各面积区间的园区数量
     * 
     * @return 面积区间统计
     */
    List<Map<String, Object>> countByAreaRange();

    /**
     * 查询最近更新的园区
     * 
     * @param limit 限制数量
     * @return 园区列表
     */
    List<BlParkVo> selectRecentlyUpdated(int limit);

    /**
     * 查询最新创建的园区
     * 
     * @param limit 限制数量
     * @return 园区列表
     */
    List<BlParkVo> selectRecentlyCreated(int limit);

    /**
     * 根据综合条件查询园区
     * 
     * @param conditions 综合查询条件
     * @return 园区列表
     */
    List<BlParkVo> selectByComplexConditions(Long areaId, BigDecimal minPrice, BigDecimal maxPrice, BigDecimal minArea, BigDecimal maxArea, String isRecommend, List<String> warehouseTypes, List<Long> tagIds);

    /**
     * 根据综合条件查询园区（Map参数版本）
     * @param conditions 查询条件Map
     * @return 园区列表
     */
    List<BlParkVo> selectByComplexConditionsFromMap(Map<String, Object> conditions);
    /**
     * 维护园区-配置中间表（全量替换）。
     * @param parkId 园区ID
     * @param parkConfigIds 配置ID集合（可为空表示清空关系）
     */
    void replaceParkConfigs(Long parkId, List<Long> parkConfigIds);

    /**
     * 维护园区-服务中间表（全量替换）。
     * @param parkId 园区ID
     * @param serviceIds 服务ID集合（可为空表示清空关系）
     */
    void replaceParkServices(Long parkId, List<Long> serviceIds);

    /**
     * 维护园区-标签中间表（全量替换）。
     * @param parkId 园区ID
     * @param tagIds 标签ID集合（可为空表示清空关系）
     */
    void replaceParkTags(Long parkId, List<Long> tagIds);

    // ========= 推荐状态管理 =========
    /**
     * 根据区域ID查询园区列表
     * 
     * @param areaId 区域ID
     * @return 园区列表
     */
    List<BlParkVo> selectByAreaId(Long areaId);

    /**
     * 将指定区域下除指定园区外的其他园区设置为非推荐状态
     * 
     * @param areaId 区域ID
     * @param excludeParkId 排除的园区ID
     * @return 影响行数
     */
    int updateOtherParksToNotRecommend(Long areaId, Long excludeParkId);

    /**
     * 智能更新园区推荐状态（确保区域下只有一个推荐园区）
     * 
     * @param parkId 园区ID
     * @param isRecommend 推荐状态
     * @return 影响行数
     */
    int smartUpdateRecommendStatus(Long parkId, String isRecommend);
}
